package com.springboot.demo.io;

import java.nio.ByteBuffer;

/**
 * byteBuffer gc 测试
 *
 * -XX:+ExplicitGCInvokesConcurrent
 * 使用CMS收集器时，System.GC() 默认会触发一次 Full GC, 使用 -XX:+ExplicitGCInvokesConcurrent命令
 * 保证 JVM 无论什么时候调用 System.GC()，都执行 CMS GC，而不是 Full GC
 *
 * -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
 * 保证当有系统 System.GC()调用时，永久代也被包括进 CMS 垃圾回收的范围内
 *
 * 因此，通过使用这些标志，我们可以防止出现意料之外的 STW 的系统 GC
 *
 *
 * -XX:-PrintFlagsFinal
 * -XX:+PrintGCTimeStamps
 * -XX:+PrintGCDetails
 * -XX:MaxDirectMemorySize=2m
 * -XX:-PrintFlagsInitial
 * -XX:+UseConcMarkSweepGC
 * -XX:-ExplicitGCInvokesConcurrent
 * -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
 *
 * @author supu
 * @since 2020-11-24 16:35
 **/
public class ByteBufferGcTest {
    public static void main(String[] args) {
        ByteBuffer byteBuffer1 = ByteBuffer.allocateDirect(2*1024*1024);

        // 这里将会触发 System.gc() 方法回收堆外内存，手动释放内存
        byteBuffer1 = null;

        ByteBuffer byteBuffer2 = ByteBuffer.allocateDirect(1);
    }
}
